// PartsLadderLineWidget.hpp

#ifndef PARTSLADDERLINEWIDGET_HPP
#define PARTSLADDERLINEWIDGET_HPP

#include "assembly/widget/PartsChartWidget.hpp" // 确保包含正确的相对路径
#include "store/struct/LadderLineCarrier.hpp"   // 包含 LadderLineCarrier 的定义
#include "tool/TimeHelper.hpp"                  // 包含 roundUpToNearest 的定义
#include <QtCharts/QLineSeries>
#include <QDebug>
#include <QPen>
#include <QtMath> // 用于 std::ceil
/**
 * @brief 阶梯折线图部件
 *
 * 特性：
 * 1. 继承自 PartsChartWidget。
 * 2. 提供可选的固定宽度和高度，-1 表示自适应父容器。
 * 3. 启用鼠标操作（缩放、拖拽）。
 * 4. 使用 `addStepLine` 函数添加阶梯折线数据。
 *
 * 纯头文件实现，无需 .cpp 文件。
 */
class PartsLadderLineWidget : public PartsChartWidget {
    Q_OBJECT

public:
    /**
     * @brief 构造函数。
     * @param w 宽度，-1 表示自适应。
     * @param h 高度，-1 表示自适应。
     * @param parent 父窗口。
     */
    inline explicit PartsLadderLineWidget(int w = -1, int h = -1, QWidget* parent = nullptr)
        : PartsChartWidget(parent) {
        // 设置控件大小策略
        setChartSize(w, h);

        // 启用鼠标操作
        setMouseOperationEnabled(true);

        // 配置 Y 轴为数值型
        setYAxisType("value");

        // 设置 Y 轴范围和刻度数
        setYAxisRange(0, 1);
        setYAxisTickCount(2);

        // 可选设置
        chart->legend()->hide();
        chart->setAnimationOptions(QChart::SeriesAnimations);
    }

    /**
     * @brief 析构函数。
     */
    inline virtual ~PartsLadderLineWidget() override {
        // Qt 会自动清理子对象
    }

    /**
     * @brief 设置阶梯折线数据。
     * @param ladderLineCarrier 数据载体。
     */
    inline void setLadderLineData(const LadderLineCarrier &ladderLineCarrier) {
        if (ladderLineCarrier.dataPoints.isEmpty()) {
            qWarning() << "没有数据点可用于绘图。";
            return;
        }

        // 清除所有已有的系列
        clearAllSeries();

        double maxTrigger = ladderLineCarrier.dataPoints.last().trigger;

        // 1) 先用 ceil() 向上取整
        int integerMax = static_cast<int>(std::ceil(maxTrigger));

        // 2) 如果担心刚好略大于整数导致截断，可以再多加一步保护
        //    举例：maxTrigger=3.07 -> ceil=4，但可能还不够
        if (std::fabs(maxTrigger - integerMax) > 0.001) {
            integerMax += 1;
        }

        // 3) 根据 integerMax，决定刻度逻辑
        if (integerMax < 10) {
            // --- 小于 10 的情况：步长=1，整数刻度 ---
            //    0,1,2,3, ..., integerMax
            setXAxisRange(0, integerMax);
            setXAxisTickCount(integerMax + 1);
        } else {
            // --- 大于等于 10 的情况：步长=10 的倍数 ---
            //    先将 integerMax 进位到最近的“10 的倍数”
            //    比如 integerMax=105 -> newMax=110
            int newMax = ((integerMax + 9) / 10) * 10;

            // 设置范围 [0, newMax]
            setXAxisRange(0, newMax);

            // 刻度步长=10，则刻度依次是 0,10,20,...,newMax
            // 如果图表库是通过 setXAxisTickCount(...) 来“平均分割”区间，
            // 则需要把 tickCount 设为 (newMax / 10) + 1
            int tickCount = (newMax / 10) + 1;
            setXAxisTickCount(tickCount);
        }




        // 添加阶梯折线
        addStepLine(ladderLineCarrier);
    }

private:

    qint64 roundUpToNearest(qint64 value, qint64 multiple) {
        if (multiple == 0)
            return value;

        qint64 remainder = value % multiple;
        if (remainder == 0)
            return value;
        return value + multiple - remainder;
    }
    /**
     * @brief 清除所有系列并删除它们。
     */
    void clearAllSeries() {
        PartsChartWidget::clearAllSeries();
    }

    /**
     * @brief 设置控件大小策略。
     * @param w 宽度，-1 表示自适应。
     * @param h 高度，-1 表示自适应。
     */
    inline void setChartSize(int w, int h) {
        if (w == -1 && h == -1) {
            setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
        } else if (w == -1) {
            setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
            setFixedHeight(h);
        } else if (h == -1) {
            setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
            setFixedWidth(w);
        } else {
            setFixedSize(w, h);
        }
    }
};

#endif // PARTSLADDERLINEWIDGET_HPP
